//actions: 调用mutation的方法
import { IState, ITodo } from '@/typings';
import {
  SET_TODO,
  SET_TODO_LIST,
  REMOVE_TODO,
  SET_TODO_STATUS,
  SET_DOING_STATUS
} from './actionTypes';
import { Commit } from 'vuex';

//定义描述ctx参数的接口
interface ICtx {
  //Commit类型：vuex定义好的
  commit: Commit;
  state: IState;
}

export default {
  /**
   * 使用actionType里定义的SET_TODO方法去触发mutation
   * @param ctx 可以解构comit和state
   * @param todo 一个组装好的对象
   */
  [SET_TODO]({ commit, state }: ICtx, todo: ITodo): void {
    //调用mutations
    commit(SET_TODO, todo);
  },
  /**
   * 使用actionType里定义的SET_TODO_LIST方法去触发mutation
   * @param ctx 可以解构comit和state
   * @param todoList 一个从localStorage拿到的数组
   */
  [SET_TODO_LIST]({ commit, state }: ICtx, todoList: ITodo[]): void {
    commit(SET_TODO_LIST, todoList);
  },
  /**
   * 使用actionType里定义的REMOVE_TODO方法去触发mutation
   * @param ctx 可以解构comit和state
   * @param id 一个从视图子组件todo-item传递过来的id
   */
  [REMOVE_TODO]({ commit, state }: ICtx, id: number): void {
    commit(REMOVE_TODO, id);
  },
  /**
   * 使用actionType里定义的SET_TODO_STATUS方法去触发mutation
   * @param ctx 可以解构comit和state
   * @param id 一个从视图子组件todo-item传递过来的id
   */
  [SET_TODO_STATUS]({ commit, state }: ICtx, id: number): void {
    commit(SET_TODO_STATUS, id);
  },
  /**
   * 使用actionType里定义的SET_DOING_STATUS方法去触发mutation
   * @param ctx 可以解构comit和state
   * @param id 一个从视图子组件todo-item传递过来的id
   */
  [SET_DOING_STATUS]({ commit, state }: ICtx, id: number): void {
    commit(SET_DOING_STATUS, id);
  }
};
